3.5. Molecular alignment#
3.5.1. A very brief introduction to molecular alignment#
The term molecular alignment can be used, in general, to define any case where the MF is specified relative to the LF in some way - for instance if the molecular symmetry axis is constrained to the LF \(z\)-axis. Herein, it is generally used more specifically, to refer to the case of a (time-dependent) aligned molecular ensemble in gas-phase experiments (e.g. as illustrated in Fig. 1.1). Any such axis distribution, in which there is a defined arrangement of axes created in the LF, can be discussed, and characterised, in terms of the axis distribution moments (ADMs), which have already been introduced passing in Sect. 3.3. More specifically, ADMs are coefficients in a multipole expansion, usually in terms of Wigner rotation matrix elements, of the molecular axis probability distribution. In this section some additional definitions are given, along with numerical examples.
The creation of an aligned ensemble in the gas phase can be achieved via a single, or sequence of, N-photon transitions, or strong-field mediated techniques. Of the latter, adiabatic and non-adiabatic alignment methods are particularly powerful, and make use of a strong, slowly-varying or impulsive laser field respectively. (Here the “slow” and “impulsive” time-scales are defined in relation to molecular rotations, roughly on the ps time-scale, with ns and fs laser fields corresponding to the typical slow and fast control fields.) In the former case, the molecular axis, or axes, will gradually align along the electric-field vector(s) while the field is present. In the latter, impulsive case, a broad rotational wavepacket (RWP) can be created, initiating complex rotational dynamics including field-free revivals of ensemble alignment. For further general discussion, there is a rich literature on molecular alignment available, see, for instance, Refs. [99, 100, 101, 102] for reviews and further introductory materials, and further discussion in the current context can be found in Quantum Metrology Vols. 1 & 2 [2, 5] and Refs. [86, 87, 103, 104, 105] and references therein.
For radial matrix elements retrieval problems based on RWP methods, the absolute degree of alignment may - or may not - be critical in a given case. The sampling of a range of different alignments, however, is vital, since this directly feeds into the information content of the measurements (see Sect. 3.3.8 and Sect. 3.7). In the case-studies of Part II, the ADMs are assumed to be known, but in general these must be determined from experimental data, this is discussed in Sect. 4.1.1.
3.5.2. Alignment distribution moments (ADMs)#
The parametrization of an aligned distribution can be given generally by an expansion in Wigner rotation matrix elements:
Where \(P(\Omega,t)\) is the full axis distribution probability, expanded for a set of Euler angles \(\Omega\), and the expansion parameters \(A^K_{Q,S}(t)\) are the ADMs.
This reduces to the 2D case if \(S=0\), which can equivalently be described as an expansion in spherical harmonics (note that the normalisation of the ADMs may be different in this case):
In the examples given in Sect. 3.3, some arbitrary choices of \(A^K_{Q,S}(t)\) were demonstrated to investigate their effects on the tensor basis sets; in the case-studies presented in Part II realistic ADMs are used for specific fitting problems. In practice this equates to (accurately) simulating rotational wavepackets, hence obtaining the corresponding \(A_{Q,S}^{K}(t)\) parameters (expectation values), as a function of laser fluence and rotational temperature. (Given experimental data, a 2D uncertainty (or error) surface in these two fundamental quantities can then be obtained from a linear regression for each set of \(A_{Q,S}^{K}(t)\), see Ref. [] for further introductory discussion on this point.) Note that, as discussed in Sect. 2.5, computation of molecular alignment is not yet implemented in the Photoelectron Metrology Toolkit [3], so values must be obtained from other codes. ADMs used herein were all computed with codes developed by V. Makhija [106], and are available from the ePSproc [25] repo on Github.
3.5.3. Numerical setup#
For illustrative purposes, the ADMs used for the \(OCS\) fitting example are here loaded and used to compute \(P(\Omega,t)\).
Show code cell content
%matplotlib inline
# Run default config - may need to set full path here
%run '../scripts/setup_notebook.py'
# Run OCS setup script - may need to set full path here
# ADMfile = 'ADMs_8TW_120fs_5K.mat'
# dataPath = Path('../part2/OCSfitting')
dataPath = Path('/home/jovyan/QM3/doc-source/part2/OCSfitting')
# Run general config script with dataPath set above
%run {dataPath/"setup_fit_demo_OCS.py"} -d {dataPath} -a {dataPath} -c "OCS"
*** Setting up notebook with standard Quantum Metrology Vol. 3 imports...
For more details see https://pemtk.readthedocs.io/en/latest/fitting/PEMtk_fitting_basic_demo_030621-full.html
To use local source code, pass the parent path to this script at run time, e.g. "setup_fit_demo ~/github"
*** Running: 2023-07-22 13:38:46
Working dir: /home/jovyan/jake-home/buildTmp/_latest_build/html/doc-source/part1
Build env: html
* Loading packages...
* sparse not found, sparse matrix forms not available.
* natsort not found, some sorting functions not available.
* Setting plotter defaults with epsproc.basicPlotters.setPlotters(). Run directly to modify, or change options in local env.
* Set Holoviews with bokeh.
* pyevtk not found, VTK export not available.
* Set Holoviews with bokeh.
Jupyter Book : 0.15.1
External ToC : 0.3.1
MyST-Parser : 0.18.1
MyST-NB : 0.17.2
Sphinx Book Theme : 1.0.1
Jupyter-Cache : 0.6.1
NbClient : 0.7.4
*** Setting up demo fitting workspace and main `data` class object...
For more details see https://pemtk.readthedocs.io/en/latest/fitting/PEMtk_fitting_basic_demo_030621-full.html
To use local source code, pass the parent path to this script at run time, e.g. "setup_fit_demo ~/github"
* Loading packages...
* Set Holoviews with bokeh.
* Loading demo matrix element data from /home/jovyan/QM3/doc-source/part2/OCSfitting
*** Warning: Missing records, expected 64, found 48.
*** Warning: Found 16 blank sets of matrix elements, symmetries ['A2']
*** Molecular structure
*** Molecular orbital list (from ePS output file)
EH = Energy (Hartrees), E = Energy (eV), NOrbGrp, OrbGrp, GrpDegen = degeneracies and corresponding orbital numbering by group in ePS, NormInt = single centre expansion convergence (should be ~1.0).
*** Warning: some orbital convergences outside single-center expansion convergence tolerance (0.01):
[[1. 0.66056934]
[2. 0.96318872]
[4. 0.95118653]
[6. 0.9785498 ]
[7. 0.9785498 ]]
*** Job subset details
Key: subset
No 'job' info set for self.data[subset].
*** Job orb13 details
Key: orb13
Dir /home/jovyan/QM3/doc-source/part2/OCSfitting, 1 file(s).
{ 'batch': 'ePS OCS, batch OCS_survey, orbital orb10',
'event': 'orb 10 (A1/S) ionization, basic survey run.',
'orbE': -17.32548962282056,
'orbLabel': 'A1/S'}
*** Job orb14 details
Key: orb14
Dir /home/jovyan/QM3/doc-source/part2/OCSfitting, 1 file(s).
{ 'batch': 'ePS OCS, batch OCS_survey, orbital orb11',
'event': ' orb 11 ionization, basic survey run.',
'orbE': -11.35803261907539,
'orbLabel': '# OCS, orb 11 ionization, basic survey run.'}
*** Running with default OCS settings.
* Loading demo ADM data from dir /home/jovyan/QM3/doc-source/part2/OCSfitting...
*** Scanning dir
/home/jovyan/QM3/doc-source/part2/OCSfitting
Found 5 .dat file(s)
* Subselecting data...
*** Setting for OCS case study.
Subselected from dataset 'orb13', dataType 'matE': 132 from 7104 points (1.86%)
Subselected from dataset 'pol', dataType 'pol': 1 from 3 points (33.33%)
ADMs: Selecting 31 points from 1775
* Calculating AF-BLMs...
Subselected from dataset 'sim', dataType 'AFBLM': 279 from 279 points (100.00%)
*Setting up fit parameters (with constraints)...
Set 22 complex matrix elements to 44 fitting params, see self.params for details.
Auto-setting parameters.
*** Setup demo fitting workspace OK.
OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.
| props | Sym | EH | Occ | E | NOrbGrp | OrbGrp | GrpDegen | NormInt |
|---|---|---|---|---|---|---|---|---|
| orb | ||||||||
| 1 | S | -91.990 | 2.0 | -2503.178 | 1.0 | 1.0 | 1.0 | 0.661 |
| 2 | S | -20.675 | 2.0 | -562.590 | 1.0 | 2.0 | 1.0 | 0.963 |
| 3 | S | -11.445 | 2.0 | -311.437 | 1.0 | 3.0 | 1.0 | 1.000 |
| 4 | S | -8.994 | 2.0 | -244.728 | 1.0 | 4.0 | 1.0 | 0.951 |
| 5 | S | -6.676 | 2.0 | -181.674 | 1.0 | 5.0 | 1.0 | 0.994 |
| 6 | P | -6.672 | 2.0 | -181.557 | 1.0 | 6.0 | 2.0 | 0.979 |
| 7 | P | -6.672 | 2.0 | -181.557 | 2.0 | 6.0 | 2.0 | 0.979 |
| 8 | S | -1.537 | 2.0 | -41.832 | 1.0 | 7.0 | 1.0 | 0.998 |
| 9 | S | -1.088 | 2.0 | -29.595 | 1.0 | 8.0 | 1.0 | 0.997 |
| 10 | S | -0.791 | 2.0 | -21.513 | 1.0 | 9.0 | 1.0 | 0.999 |
| 11 | P | -0.674 | 2.0 | -18.349 | 1.0 | 10.0 | 2.0 | 1.000 |
| 12 | P | -0.674 | 2.0 | -18.349 | 2.0 | 10.0 | 2.0 | 1.000 |
| 13 | S | -0.637 | 2.0 | -17.325 | 1.0 | 11.0 | 1.0 | 0.999 |
| 14 | P | -0.417 | 2.0 | -11.358 | 1.0 | 12.0 | 2.0 | 0.999 |
| 15 | P | -0.417 | 2.0 | -11.358 | 2.0 | 12.0 | 2.0 | 0.999 |
| name | value | initial value | min | max | vary | expression |
|---|---|---|---|---|---|---|
| m_P_S_P_1_n1_1_1 | 0.29855615 | 0.2985561542822338 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_1_1_n1_1 | 0.29855615 | 0.2985561542822338 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_1_n1_1_1 |
| m_P_S_P_2_n1_1_1 | 0.73539252 | 0.7353925213406409 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_2_1_n1_1 | 0.73539252 | 0.7353925213406409 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_2_n1_1_1 |
| m_P_S_P_3_n1_1_1 | 0.96563030 | 0.9656303024537579 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_3_1_n1_1 | 0.96563030 | 0.9656303024537579 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_3_n1_1_1 |
| m_P_S_P_4_n1_1_1 | 0.87524970 | 0.8752497032478336 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_4_1_n1_1 | 0.87524970 | 0.8752497032478336 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_4_n1_1_1 |
| m_P_S_P_5_n1_1_1 | 0.54089206 | 0.540892060274403 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_5_1_n1_1 | 0.54089206 | 0.540892060274403 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_5_n1_1_1 |
| m_P_S_P_6_n1_1_1 | 0.10767112 | 0.10767111625440502 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_6_1_n1_1 | 0.10767112 | 0.10767111625440502 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_6_n1_1_1 |
| m_P_S_P_7_n1_1_1 | 0.03593861 | 0.03593860506027919 | 1.0000e-04 | 5.00000000 | True | |
| m_P_S_P_7_1_n1_1 | 0.03593861 | 0.03593860506027919 | 1.0000e-04 | 5.00000000 | False | m_P_S_P_7_n1_1_1 |
| m_S_S_S_0_0_0_1 | 0.60665765 | 0.6066576511927669 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_1_0_0_1 | 0.85468396 | 0.85468396237864 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_2_0_0_1 | 0.96737671 | 0.9673767060598555 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_3_0_0_1 | 1.20414246 | 1.2041424620510626 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_4_0_0_1 | 0.56294233 | 0.5629423306629698 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_5_0_0_1 | 0.53536586 | 0.5353658607356114 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_6_0_0_1 | 0.14683631 | 0.1468363147456257 | 1.0000e-04 | 5.00000000 | True | |
| m_S_S_S_7_0_0_1 | 0.02578010 | 0.025780104099419776 | 1.0000e-04 | 5.00000000 | True | |
| p_P_S_P_1_n1_1_1 | -2.20025008 | -2.2002500817877007 | -3.14159265 | 3.14159265 | False | |
| p_P_S_P_1_1_n1_1 | -2.20025008 | -2.2002500817877007 | -3.14159265 | 3.14159265 | False | p_P_S_P_1_n1_1_1 |
| p_P_S_P_2_n1_1_1 | -1.41027948 | -1.410279483496634 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_2_1_n1_1 | -1.41027948 | -1.410279483496634 | -3.14159265 | 3.14159265 | False | p_P_S_P_2_n1_1_1 |
| p_P_S_P_3_n1_1_1 | -2.10036478 | -2.1003647759598385 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_3_1_n1_1 | -2.10036478 | -2.1003647759598385 | -3.14159265 | 3.14159265 | False | p_P_S_P_3_n1_1_1 |
| p_P_S_P_4_n1_1_1 | -0.79968941 | -0.7996894100017765 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_4_1_n1_1 | -0.79968941 | -0.7996894100017765 | -3.14159265 | 3.14159265 | False | p_P_S_P_4_n1_1_1 |
| p_P_S_P_5_n1_1_1 | 0.13130309 | 0.1313030912129834 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_5_1_n1_1 | 0.13130309 | 0.1313030912129834 | -3.14159265 | 3.14159265 | False | p_P_S_P_5_n1_1_1 |
| p_P_S_P_6_n1_1_1 | 1.21842569 | 1.2184256877240447 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_6_1_n1_1 | 1.21842569 | 1.2184256877240447 | -3.14159265 | 3.14159265 | False | p_P_S_P_6_n1_1_1 |
| p_P_S_P_7_n1_1_1 | 2.85518161 | 2.855181606211792 | -3.14159265 | 3.14159265 | True | |
| p_P_S_P_7_1_n1_1 | 2.85518161 | 2.855181606211792 | -3.14159265 | 3.14159265 | False | p_P_S_P_7_n1_1_1 |
| p_S_S_S_0_0_0_1 | -2.00284939 | -2.002849388515922 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_1_0_0_1 | 0.98281462 | 0.9828146214355553 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_2_0_0_1 | 2.67926157 | 2.6792615692036366 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_3_0_0_1 | -0.53515193 | -0.5351519304402492 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_4_0_0_1 | 0.34275245 | 0.3427524526944807 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_5_0_0_1 | 2.06529698 | 2.0652969751444488 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_6_0_0_1 | 2.59355582 | 2.5935558239072343 | -3.14159265 | 3.14159265 | True | |
| p_S_S_S_7_0_0_1 | -1.51850664 | -1.5185066381133423 | -3.14159265 | 3.14159265 | True |
Show code cell content
# The general config script sets an ADM Xarray, and a downsampled version in 'subset'
print(data.data['subset']['ADM'].dims)
# Tidy up t-coords for demo case, set to reduced d.p.
data.data['subset']['ADM']['t'] = data.data['subset']['ADM'].t.pipe(np.round, decimals=3)
print('*** Set reduced t-coords for demo case')
print(data.data['subset']['ADM'].t)
('ADM', 't')
*** Set reduced t-coords for demo case
<xarray.DataArray 't' (t: 31)>
array([38.012, 38.211, 38.409, 38.608, 38.806, 39.005, 39.203, 39.402, 39.6 ,
39.798, 39.997, 40.195, 40.394, 40.592, 40.791, 40.989, 41.188, 41.386,
41.585, 41.783, 41.982, 42.18 , 42.379, 42.577, 42.775, 42.974, 43.172,
43.371, 43.569, 43.768, 43.966])
Coordinates:
* t (t) float64 38.01 38.21 38.41 38.61 ... 43.37 43.57 43.77 43.97
Attributes:
units: ps
# Quick plot for subselected ADMs (setup in the script), using hvplot
# data.data['subset']['ADM'].unstack().squeeze().real.hvplot.line(x='t').overlay('K')
# As above, but plot K>0 terms only, and keep 'Q','S' indexes (here all =0)
data.data['subset']['ADM'].unstack().where(data.data['subset']['ADM'].unstack().K>0) \
.real.hvplot.line(x='t').overlay(['K','Q','S'])
3.5.4. Compute \(P(\theta,\Phi,t)\) distributions#
For 1D and 2D cases, the full axis distributions can be expanded in spherical harmonics and plotted using Photoelectron Metrology Toolkit [3] class methods. This is briefly illustrated below. Note that expansions in Wigner rotation matrix elements are not currently supported by these routines.
# NOTE - need this in some builds if Matplotlib has call-back errors.
%matplotlib inline
# Plot P(theta,t) with summation over phi dimension
# Note the plotting function automatically expands the ADMs in spherical harmonics
dataKey = 'subset'
data.padPlot(keys = dataKey, dataType='ADM', Etype = 't', pStyle='grid', reducePhi='sum', returnFlag = True)
Using default sph betas.
Summing over dims: set()
Plotting from self.data[subset][ADM], facetDims=['t', None], pType=a with backend=mpl.
Grid plot: ('subset', 'ADM'), dataType: ADM, plotType: a
Set plot to self.data['subset']['plots']['ADM']['grid']
# Plot full axis distributions at selected time-steps
tPlot = [39.402, 40.791, 42.18] # Manual setting for baseline case, and at max and min K=2 times.
# Alternatively, plot at selected times by index slice
# Note that selDims below requires labels (not index inds)
# tPlot = data.data[dataKey]['ADM'].t[::5]
data.padPlot(keys = dataKey, dataType='ADM', Etype = 't', pType='a',
returnFlag = True, selDims={'t':tPlot}, backend='pl')
Using default sph betas.
Summing over dims: set()
Plotting from self.data[subset][ADM], facetDims=['t', None], pType=a with backend=pl.
Set plot to self.data['subset']['plots']['ADM']['polar']